// 导入axios和Message工具
import axios from 'axios';
import Message from '@/utils/Message.js';

// 导入ElLoading组件和router
import { ElLoading } from 'element-plus';
import router from '../router';

// 定义表单提交和json提交的content-type
const contentTypeForm = 'application/x-www-form-urlencoded;charset=UTF-8'
const contentTypeJson = 'application/json'

// 创建axios实例
const instance = axios.create({
    baseURL: '/api',
    timeout: 3 * 1000
})

// 定义loading变量
let loading = null
// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        // 如果config中showLoading为true，则显示loading
        if (config.showLoading) {
            loading = ElLoading.service({
                lock: true,
                text: '加载中......',
                background: 'rgba(0, 0, 0, 0.7)',
            })
        }
        return config
    }, (error) => {
        // 如果config中showLoading为true，则关闭loading
        if (error.config.showLoading && loading) {
            loading.close()
        }
        // 显示错误信息
        Message.error('请求发送失败')
        return Promise.reject('请求发送失败')
    })

// 响应拦截器
instance.interceptors.response.use(
    (response) => {
        // 获取config中的showLoading、errorCallback、showError
        const { showLoading, errorCallback, showError } = response.config
        // 如果config中showLoading为true，则关闭loading
        if (showLoading && loading) {
            loading.close()
        }
        // 获取响应数据
        const responseData = response.data
        // 如果响应数据code为200，则返回响应数据
        if (responseData.code == 200) {
            return responseData
        // 如果响应数据code为901，则跳转到登录页面
        } else if (responseData.code == 901) {
            setTimeout(() => {
                router.push('/login')
            }, 2000)
            return Promise.reject({ showError: false, msg: '登陆超时' })
        // 否则，如果errorCallback存在，则调用errorCallback，否则返回错误信息
        } else {
            if (errorCallback) {
                errorCallback(responseData)
            }
            return Promise.reject({ showError: showError, msg: responseData.info })
        }
    }, (error) => {
        // 如果config中showLoading为true，则关闭loading
        if (error.config.showLoading && loading) {
            loading.close()
        }
        // 返回错误信息
        return Promise.reject({ showError: false, msg: '网络异常' })
    }
)

// 定义request函数
const request = (config) => {
    // 获取config中的url、params、dataType、showLoading、errorCallback、showError
    const { url, params, dataType, showLoading = true, errorCallback, showError = true } = config
    // 定义contentType
    let contentType = contentTypeForm
    // 定义formData
    let formData = new FormData();
    // 遍历params，将params中的键值对添加到formData中
    for (let key in params) {
        formData.append(key, params[key] == undefined ? '' : params[key])
    }

    // 如果dataType不为null且dataType为json，则contentType为contentTypeJson
    if (dataType !== null && dataType === 'json') {
        contentType = contentTypeJson
    }

    // 定义headers
    let headers = {
        'Content-Type': contentType,
        'x-Requested-With': 'XMLHttpRequest',
    }
    // 发送post请求
    return instance.post(url, formData, {
        headers: headers,
        showLoading: showLoading,
        errorCallback: errorCallback,
        showError: showError
    }).catch(error => {
        // 如果error中showError为true，则显示错误信息
        if (error.showError) {
            Message.error(error.msg)
        }
        // 返回null
        return null
    })
}

// 导出request函数
export default request